#ifndef LOGGER_H_
#define LOGGER_H_

#include <string>

#include "LockFile.h"

class Logger {
	
public:
	class LogLevel {
	public:
		static const int ERROR = 0;
		static const int WARN = 1;
		static const int INFO = 2;
		static const int DEBUG = 3;
	};
	
private:
	/**
	 * Instancia singleton de la clase Logger.
	 */
	static Logger* instance;
	
	/**
	 * Archivo de configuracion del log lockeable.
	 */
	LockFile lockLogfile;
	
	/**
	 * Archivo de configuracion del log.
	 */
	static std::string pathToLogfile;
	
	/**
	 * Nivel de loggeo.
	 */
	static int loggingLevel;
	
	/**
	 * Constructor privado de la clase Logger.
	 */
	Logger();
	
	/*
	 * Arma el string con la fecha y hora actuales.
	 */
	std::string getTime();
	
	/**
	 * Inserta un mensaje en el archivo de log.
	 */
	void insert(int key, std::string value);
	
	
	/**
	 * Inicializa el logger.
	 */
	static void init();
	
public:
	
	/**
	 * Devuelve la unica instancia del singleton.
	 */
	static Logger* getInstance();
	
	/**
	 * Escribe un mensaje de debug sobre el log.
	 */
	void debug(std::string message);
	
	/**
	 * Escribe un mensaje de informacion sobre el log.
	 */
	void info(std::string message);
	
	/**
	 * Escribe un mensaje de warning sobre el log.
	 */
	void warn(std::string message);
	
	/**
	 * Escribe un mensaje de error sobre el log.
	 */
	void error(std::string message);
	
	/**
	 * Destructor virtual de la clase Logger.
	 */
	virtual ~Logger();
	
	/**
	 * Cierra el logger y libera rescursos.
	 */
	static void destroy();
};

#endif /* LOGGER_H_ */
